/*
 * WindowManager.cpp
 *
 *  Created on: 2024年10月19日
 *      Author: Administrator
 */
#include "WindowManager.hpp"
#include <algorithm>

// 添加一个新的窗口
void WindowManager::addWindow(ZKWindow* window) {
	windows.push_back(window);
}

// 设置当前活动的窗口
void WindowManager::setActiveWindow(size_t index) {
	if (index >= 0 && index < windows.size()) {
		currentWindowIndex = index;
		showCurrentWindow();
	}
}

// 切换到上一个窗口
void WindowManager::switchToPreviousWindow() {
	currentWindowIndex = (currentWindowIndex - 1 + windows.size())
			% windows.size();
	showCurrentWindow();
}

// 切换到下一个窗口
void WindowManager::switchToNextWindow() {
	currentWindowIndex = (currentWindowIndex + 1) % windows.size();
	showCurrentWindow();
}

// 设置窗口列表
void WindowManager::setWindows(const std::vector<ZKWindow*>& newWindows) {
	windows = newWindows;
	// 重置当前窗口索引，确保它在有效范围内
	if (currentWindowIndex >= windows.size()) {
		currentWindowIndex = 0;  // 如果没有窗口，则重置为0
	}
	showCurrentWindow();
}

// 隐藏当前窗口，显示下个窗口
void WindowManager::hideCurrentAndShowNext() {
	if (windows.empty())
		return;

	// 隐藏当前窗口
	windows[currentWindowIndex]->hideWnd();

	// 切换到下一个窗口
	currentWindowIndex = (currentWindowIndex + 1) % windows.size();
	windows[currentWindowIndex]->showWnd();
}

// 隐藏当前窗口，显示上个窗口
void WindowManager::hideCurrentAndShowPrevious() {
	if (windows.empty())
		return;

	// 隐藏当前窗口
	windows[currentWindowIndex]->hideWnd();

	// 切换到上一个窗口
	currentWindowIndex = (currentWindowIndex - 1 + windows.size())
			% windows.size();
	windows[currentWindowIndex]->showWnd();
}

// 显示当前窗口，隐藏其他窗口
void WindowManager::showCurrentWindow() {
	for (size_t i = 0; i < windows.size(); ++i) {
		if (i == currentWindowIndex) {
			windows[i]->showWnd();
		} else {
			windows[i]->hideWnd();
		}
	}
}

size_t WindowManager::getIndex(){
	return currentWindowIndex;
}

// 移除指定索引的窗口
void WindowManager::removeWindow(size_t index) {
    if (index < windows.size()) {
        // 删除窗口
        delete windows[index];  // 假设窗口对象是由WindowManager管理的生命周期
        windows.erase(windows.begin() + index);

        // 更新当前活动窗口的索引
        if (currentWindowIndex >= windows.size()) {
            currentWindowIndex = windows.empty() ? 0 : windows.size() - 1;
        }

        // 显示更新后的当前窗口
        showCurrentWindow();
    }
}

// 移除指定窗口指针的窗口
void WindowManager::removeWindow(ZKWindow* window) {
    auto it = std::find(windows.begin(), windows.end(), window);
    if (it != windows.end()) {
        size_t index = std::distance(windows.begin(), it);
        removeWindow(index);  // 使用上面定义的方法
    }
}






// 设置全局的文本控件列表
void TextViewManager::setGlobalTextViews(const std::vector<ZKTextView*>& textViews) {
    mGlobalTextViews = textViews;
    mCurrentTextViewIndex = 0;  // 默认显示第一个文本控件
//    if (!mGlobalTextViews.empty()) {
//        showTextViewAtIndex(mCurrentTextViewIndex);
//    }
}

// 显示指定下标的文本控件，并隐藏其他文本控件
void TextViewManager::showTextViewAtIndex(size_t index) {
    if (index >= mGlobalTextViews.size()) {
//        LOGE("Index out of bounds: %zu", index);
        return;
    }

    for (size_t i = 0; i < mGlobalTextViews.size(); ++i) {
        if (i == index) {
            mGlobalTextViews[i]->setVisible(true);  // 显示指定下标的文本控件
        } else {
            mGlobalTextViews[i]->setVisible(false); // 隐藏其他文本控件
        }
    }

    mCurrentTextViewIndex = index;  // 更新当前显示文本的下标
}

// 返回当前显示文本的下标
size_t TextViewManager::getCurrentTextViewIndex() const {
    return mCurrentTextViewIndex;
}

// 隐藏当前文本，显示下一个文本
void TextViewManager::showNextTextView() {
    if (mGlobalTextViews.empty()) {
        return;
    }

    mGlobalTextViews[mCurrentTextViewIndex]->setVisible(false);
    mCurrentTextViewIndex = (mCurrentTextViewIndex + 1) % mGlobalTextViews.size();
    mGlobalTextViews[mCurrentTextViewIndex]->setVisible(true);
}

// 隐藏当前文本，显示上一个文本
void TextViewManager::showPreviousTextView() {
    if (mGlobalTextViews.empty()) {
        return;
    }

    mGlobalTextViews[mCurrentTextViewIndex]->setVisible(false);
    mCurrentTextViewIndex = (mCurrentTextViewIndex + mGlobalTextViews.size() - 1) % mGlobalTextViews.size();
    mGlobalTextViews[mCurrentTextViewIndex]->setVisible(true);
}

// 隐藏所有文本控件
void TextViewManager::hideAllTextViews() {
    for (auto& textView : mGlobalTextViews) {
        textView->setVisible(false);
    }
}

